home *** CD-ROM | disk | FTP | other *** search
- {
- > >I've got code to do this in Turbo Pascal, using the DOS Services interrupt
- > >(21), function number 69H. But this does not work in Delphi. I'm sure this
- > >can be done using the DOS3CALL function, but I've tried and tried, and I can't
- > >seem to get it to work. Any ideas?
- >
- > >Mike
- > >m.d.bews@swansea.ac.uk
- >
- > This will do it !
- }
- unit Procs;
-
- interface
-
- uses
- Forms, DB, DBGrids, DBTables, Graphics, Classes, Dialogs;
-
- Type
- TRWBlock = Record
- rwSpecFunc: Byte;
- rwHead: Word;
- rwCylinder: Word;
- rwFirstSector: Word;
- rwSectors: Word;
- rwBufPtr: Pointer;
- End;
-
- TBootSector = Record
- bsJump: Array[0..2] of Byte;
- bsOemName: Array[0..7] of Char;
- bsBytesPerSec: Word;
- bsSecPerClust: Byte;
- bsResSectors: Word;
- bsFATs: Byte;
- bsRootDirEnts: Word;
- bsSectors: Word;
- bsMedia: Byte;
- bsFATSecs: Word;
- bsSecPerTrack: Word;
- bsHeads: Word;
- bsHiddensecs: Longint;
- bsHugeSectors: LongInt;
- bsDriveNumber: Byte;
- bsReserved: Byte;
- bsBootsignature: Byte;
- bsVolumeID: Array[0..3] of Byte;
- bsVolumeLabel: Array[0..10] of Char;
- bsFileSysType: Array[0..7] of Char;
- End;
-
- Const RWBlock: TRWBlock = (rwSpecFunc: 0;
- rwHead: 0;
- rwCylinder: 0;
- rwfirstSector: 0;
- rwSectors: 1;
- rwBufPtr: nil);
-
- Function ReadBootSector(Drive: Word; Var BootSector: TBootsector): Boolean;
-
- implementation
-
- Uses MsgForm;
-
- Function ReadBootSector(Drive: Word; Var BootSector: TBootsector): Boolean;
- Var Buffer: Array[0..1023] of Byte; Status: Word;
- Begin
- RWBlock.rwBufPtr := addr(Buffer);
- asm
- mov bx, Drive
- mov ch, 08h
- mov cl, 61h
- mov dx, seg RWBlock
- mov ds, dx
- mov dx, offset RWBlock
- mov ax, 440dh
- int 21h
- jc @Error_handler
- jmp @ok
- @Error_handler:
- mov Status, ax
- jmp @exit
- @ok:
- mov status, 0
- @exit:
- End;
- ReadBootSector := Status = 0;
- If Status = 0 Then Move(Buffer, BootSector, SizeOf(TBootSector));
- End;
-
- end.
-
- { ------------- ANOTHER WAY TO DO IT -------------------- }
-
- Type
- InfoBuffer = RECORD
- InfoLevel : WORD;
- Serial : DWord;
- VolLabel : ARRAY [0..10]OF CHAR;
- FileSystem : ARRAY [0..7]OF CHAR;
- End;
-
- Function TFMain.GetDiskSerNo(Drive : Byte) : String;
- Const
- HexDigits : ARRAY [0..15]OF CHAR = '0123456789ABCDEF';
- Var
- IB : InfoBuffer;
- N : WORD;
-
- Function SerialStr (L : LONGINT) : String;
- Var
- Temp : String;
- Begin
- {Temp [0] := #9; }
- Temp [1] := HexDigits [L SHR 28];
- Temp [2] := HexDigits [ (L SHR 24) AND $F];
- Temp [3] := HexDigits [ (L SHR 20) AND $F];
- Temp [4] := HexDigits [ (L SHR 16) AND $F];
- Temp [5] := '-';
- Temp [6] := HexDigits [ (L SHR 12) AND $F];
- Temp [7] := HexDigits [ (L SHR 8) AND $F];
- Temp [8] := HexDigits [ (L SHR 4) AND $F];
- Temp [9] := HexDigits [L AND $F];
- SerialStr := Temp;
- End;
-
- Function GetSerial (DiskNum : BYTE; VAR I : InfoBuffer) : WORD; assembler;
- asm
- MOV AH, 69h
- MOV AL, 00h
- MOV BL, DiskNum
- PUSH DS
- LDS DX, I {error here "Operand Size Mismatch I"}
- INT 21h
- POP DS
- JC @Bad
- XOR AX, AX
- @Bad :
- end;
-
- Begin
- N := GetSerial (Drive, IB);
- If N = 0 then
- Result := SerialStr (IB.Serial)
- else
- Result := 'Error Reading Disk';
- End;
-